home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / flyEngine / flyBsp.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-02-27  |  6.5 KB  |  332 lines

  1. #include "../Fly3D.h"
  2.  
  3. bsp_node::~bsp_node()
  4. {
  5.     if (elem) delete elem;
  6.     if (child[0]) delete child[0];
  7.     if (child[1]) delete child[1];
  8. }
  9.  
  10. mesh *bsp_object::ray_intersect(vector& ro,vector& rd,vector& ip,float& dist,int &facenum,float rad)
  11.     mesh *objmesh=get_mesh();
  12.  
  13.     if (objmesh) 
  14.     {
  15.         static float d1,d2;
  16.         vector ro_local=(ro-pos)*mat_t,
  17.             rd_local=rd*mat_t;
  18.         if (objmesh->bbox.ray_intersect(ro_local,rd_local,d1,d2))
  19.         {
  20.         facenum=objmesh->ray_intersect(ro_local,rd_local,ip,dist,rad);
  21.         if (facenum>-1)
  22.             {
  23.             ip=ip*mat+pos;
  24.             return objmesh;
  25.             }
  26.         }
  27.     }
  28.     return 0;
  29. }
  30.  
  31. int bsp_object::ray_intersect_test(vector& ro,vector& rd,float rad)
  32.     mesh *objmesh=get_mesh();
  33.  
  34.     if (objmesh) 
  35.     {
  36.         static float d1,d2;
  37.         vector ro_local=(ro-pos)*mat_t,
  38.             rd_local=rd*mat_t;
  39.         if (objmesh->bbox.ray_intersect(ro_local,rd_local,d1,d2))
  40.         if (objmesh->ray_intersect_test(ro_local,rd_local,rad))
  41.             return 1;
  42.     }
  43.     return 0;
  44. }
  45.  
  46. void bsp_object::remove_from_bsp()
  47. {
  48.     if (node==0) return;
  49.     bsp_object *e=node->elem,*ep=0;
  50.     while(e)
  51.     {
  52.         if (e==this)
  53.             {
  54.             if (next_elem==0)
  55.                 if (ep)
  56.                     node->last_elem=&ep->next_elem;
  57.                 else node->last_elem=&node->elem;
  58.             if (ep)
  59.                 ep->next_elem=next_elem;
  60.             else
  61.                 node->elem=next_elem;
  62.             next_elem=0;
  63.             node=0;
  64.             return;
  65.             }
  66.         ep=e;
  67.         e=e->next_elem;
  68.     }
  69.     node=0;
  70. }
  71.  
  72. void bsp_object::add_to_bsp()
  73. {
  74.     float d;
  75.     if (node) remove_from_bsp();
  76.     node=flyengine->bsp;
  77.     while( node && node->leaf==-1)
  78.     {
  79.         d=node->distance(pos);
  80.         if (d>-SMALL)
  81.             node=node->child[0];
  82.         else node=node->child[1];
  83.     }
  84.  
  85.     if (node)
  86.     {
  87.         next_elem=0;
  88.         *node->last_elem=this;
  89.         node->last_elem=&next_elem;
  90.     }
  91. }
  92.  
  93. void bsp_object::load_params(fly_pak *file,char *sec)
  94. {
  95.     int i,n=get_param_desc(0,0);
  96.     param_desc pd;
  97.     char ret[256];
  98.  
  99.     for( i=0;i<n;i++ )
  100.     {
  101.         get_param_desc(i,&pd);
  102.         ret[0]=0;
  103.         file->get_profile_string(sec,pd.name,ret);
  104.         pd.set_string(ret);
  105.     }
  106. }
  107.  
  108. void bsp_object::load_default_params(fly_pak *file,char *sec)
  109. {
  110.     int i,n=NUM_DEFAULT_PARAM;
  111.     param_desc pd;
  112.     char ret[256];
  113.  
  114.     for( i=0;i<n;i++ )
  115.     {
  116.         get_param_desc(i,&pd);
  117.         ret[0]=0;
  118.         file->get_profile_string(sec,pd.name,ret);
  119.         pd.set_string(ret);
  120.     }
  121. }
  122.  
  123. int bsp_object::get_param_desc(int i,param_desc *pd)
  124. {
  125.     if (pd==0)
  126.         return NUM_DEFAULT_PARAM+get_custom_param_desc(0,0);
  127.     else
  128.     if (i>=NUM_DEFAULT_PARAM)
  129.         get_custom_param_desc(i-NUM_DEFAULT_PARAM,pd);
  130.     else
  131.     switch(i)
  132.     {
  133.         case 0:
  134.             pd->type='v';
  135.             pd->data=&pos;
  136.             strcpy(pd->name,"pos");
  137.             break;
  138.         case 1:
  139.             pd->type='v';
  140.             pd->data=&rot;
  141.             strcpy(pd->name,"rot");
  142.             break;
  143.         case 2:
  144.             pd->type='v';
  145.             pd->data=&vel;
  146.             strcpy(pd->name,"vel");
  147.             break;
  148.         case 3:
  149.             pd->type='v';
  150.             pd->data=&force;
  151.             strcpy(pd->name,"force");
  152.             break;
  153.         case 4:
  154.             pd->type='i';
  155.             pd->data=&life;
  156.             strcpy(pd->name,"life");
  157.             break;
  158.         case 5:
  159.             pd->type='i';
  160.             pd->data=&col_flag;
  161.             strcpy(pd->name,"colflag");
  162.             break;
  163.         case 6:
  164.             pd->type='f';
  165.             pd->data=&mass;
  166.             strcpy(pd->name,"mass");
  167.             break;
  168.         case 7:
  169.             pd->type='f';
  170.             pd->data=&radius;
  171.             strcpy(pd->name,"radius");
  172.             break;
  173.         case 8:
  174.             pd->type='f';
  175.             pd->data=≎
  176.             strcpy(pd->name,"bump");
  177.             break;
  178.         case 9:
  179.             pd->type='f';
  180.             pd->data=&friction;
  181.             strcpy(pd->name,"friction");
  182.             break;
  183.         case 10:
  184.             pd->type='i';
  185.             pd->data=&active;
  186.             strcpy(pd->name,"active");
  187.             break;
  188.         case 11:
  189.             pd->type='i';
  190.             pd->data=&latedraw;
  191.             strcpy(pd->name,"latedraw");
  192.             break;
  193.     }
  194.     return 0;
  195. }
  196.  
  197. char *param_desc::get_string()
  198. {
  199.     static char str[256];
  200.     str[0]=0;
  201.     if (type>255 || type<-255)
  202.         {
  203.         if (*((bsp_object **)data)!=0)
  204.                 strcpy(str,(*((bsp_object **)data))->name);
  205.         }
  206.     else
  207.     switch(type)
  208.         {
  209.         case 'b':
  210.             strcpy(str,flyengine->bspfile);
  211.             break;
  212.         case 'i':
  213.             sprintf(str,"%i",*((int *)data));
  214.             break;
  215.         case 'f':
  216.             sprintf(str,"%f",*((float *)data));
  217.             break;
  218.         case 'a':
  219.             sprintf(str,"%f",acos(*((float *)data))*PiUnder180);
  220.             break;
  221.         case 'c':
  222.         case 'v':
  223.             sprintf(str,"%f %f %f",
  224.                 ((float *)data)[0],
  225.                 ((float *)data)[1],
  226.                 ((float *)data)[2]);
  227.             break;
  228.         case 'p':
  229.             if (*((int *)data)!=-1)
  230.                 strcpy(str,flyengine->piclib[*((int *)data)]->name);
  231.             break;
  232.         case 'o':
  233.             if (*((bsp_object **)data)!=0)
  234.                 strcpy(str,(*((bsp_object **)data))->name);
  235.             break;
  236.         case 'd':
  237.             if (*((bsp_object **)data)!=0)
  238.                 strcpy(str,(*((bsp_object **)data))->name);
  239.             break;
  240.         case '3':
  241.             if (*((mesh **)data)!=0)
  242.                 strcpy(str,(*((mesh **)data))->name);
  243.             break;
  244.         case 'm':
  245.             if (*((mesh **)data)!=0)
  246.                 strcpy(str,(*((mesh **)data))->name);
  247.             break;
  248.         case 'z':
  249.             if (*((bezier_curve **)data)!=0)
  250.                 strcpy(str,(*((bezier_curve **)data))->name);
  251.             break;
  252.         case 'h':
  253.             if (*((bezier_patch **)data)!=0)
  254.                 strcpy(str,(*((bezier_patch **)data))->name);
  255.             break;
  256.         case 'w':
  257.             if (*((sound **)data)!=0)
  258.                 strcpy(str,(*((sound **)data))->name);
  259.             break;
  260.         case 's':
  261.             strcpy(str,(char *)data);
  262.             break;
  263.         }
  264.     return str;
  265. }
  266.  
  267. void param_desc::set_string(char *str)
  268. {
  269.     if (type>255)
  270.         (*((bsp_object **)data))=flyengine->get_stock_object(str);
  271.     else
  272.     if (type<-255)
  273.         (*((bsp_object **)data))=flyengine->get_active_object(str);
  274.     else
  275.     switch(type)
  276.     {
  277.         case 'i':
  278.             *((int *)data)=0;
  279.             sscanf(str,"%i",(int *)data);
  280.             break;
  281.         case 'f':
  282.             *((float *)data)=0;
  283.             sscanf(str,"%f",(float *)data);
  284.             break;
  285.         case 'a':
  286.             *((float *)data)=0;
  287.             sscanf(str,"%f",(float *)data);
  288.             *((float *)data)=(float)cos(*((float *)data)*PiOver180);
  289.             break;
  290.         case 'c':
  291.         case 'v':
  292.             ((float *)data)[0]=
  293.             ((float *)data)[1]=
  294.             ((float *)data)[2]=0;
  295.             sscanf(str,"%f %f %f",
  296.                 &((float *)data)[0],
  297.                 &((float *)data)[1],
  298.                 &((float *)data)[2]);
  299.             break;
  300.         case 'p':
  301.             *((int *)data)=flyengine->get_picture(str);
  302.             break;
  303.         case 'o':
  304.             *((bsp_object **)data)=flyengine->get_stock_object(str);
  305.             break;
  306.         case 'd':
  307.             *((bsp_object **)data)=flyengine->get_active_object(str);
  308.             break;
  309.         case '3':
  310.             *((mesh **)data)=flyengine->get_model_object(str);
  311.             break;
  312.         case 'm':
  313.             *((mesh **)data)=flyengine->get_model_object(str);
  314.             break;
  315.         case 'z':
  316.             *((bezier_curve **)data)=flyengine->get_bezier_curve(str);
  317.             break;
  318.         case 'h':
  319.             *((bezier_patch **)data)=flyengine->get_bezier_patch(str);
  320.             break;
  321.         case 'w':
  322.             *((sound **)data)=flyengine->get_sound_object(str);
  323.             break;
  324.         case 'b':
  325.         case 's':
  326.             strcpy((char *)data,str);
  327.             break;
  328.     }
  329. }
  330.